/**
  ******************************************************************************
  * @file    sym32l010_hal_vc.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   VC HAL module driver.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_vc.h"


/*******************************************************************************
  * @brief  VC 初始化
  * @param  VCx       : VC名称
  *                     @arg SYM_VC1
  *                     @arg SYM_VC2
  * @param  InitStruct: 初始化结构体
  * @retval None
  * @note   VC的负端选择VC内置参考源的输出时，需使能VC内置参考源
  * @note   VC的负端选择内部1.2V基准电压时，需使能ADC_CR0.BGREN
  */
void HAL_VC_Init(VC_TypeDef *VCx, VC_InitTypeDef *InitStruct)
{
    // 关闭数字滤波时请保持FLTCLK为1
    uint32_t FltClk = (InitStruct->FilterTime == VC_FILTERTIME_NONE) ? VC_FILTERCLK_PCLK : InitStruct->FilterClk;

    VCx->CR0 = (uint32_t)InitStruct->NChannel   | (uint32_t)InitStruct->PChannel  |
               (uint32_t)InitStruct->WindowEn   | (uint32_t)InitStruct->Polarity  |
               (uint32_t)InitStruct->Hysteresis | (uint32_t)InitStruct->Response;
    VCx->CR1 = (uint32_t)InitStruct->FilterTime | FltClk;
}


/*******************************************************************************
  * @brief  VC 反初始化
  * @param  VCx: VC名称
  *              @arg SYM_VC1
  *              @arg SYM_VC2
  * @retval None
  */
void HAL_VC_DeInit(VC_TypeDef *VCx)
{
    VCx->CR0 = 0x00;
    VCx->CR1 = 0x00;
}


/*******************************************************************************
  * @brief  禁止VC参考源电路
  * @param  None
  * @retval None
  * @note   VC1/VC2共用一个VC参考源输出通道
  */
void HAL_VCReference_Disable(void)
{
    REGBITS_CLR(SYM_VCREF->CR, VCREF_CR_EN_Msk);
}


/*******************************************************************************
  * @brief  配置并使能VC内置参考源
  * @param  VCrefVin:  VC参考源
  *                    @arg VCREF_VIN_AVCC
  *                    @arg VCREF_VIN_ADCREF
  * @param  DivValue:  参考源输出电压分压比
  *                    输出电压 = 参考源 × (1 + DivValue) / 8
  *                    取值范围为 0 - 7
  * @retval None
  * @note   VC1/VC2共用一个VC参考源输出通道
  *         使能VC内置参考源后，VC的负端才能选择内置VC参考源的输出
  */
void HAL_VCReference_Enable(VCREF_SourceTypeDef VCrefVin, uint8_t DivValue)
{
    SYM_VCREF->CR = (uint32_t)VCrefVin | VCREF_CR_EN_Msk | (DivValue & VCREF_CR_DIV_Msk);
}


/*******************************************************************************
  * @brief  使能 VCx
  * @param  VCx: VC名称
  *              @arg SYM_VC1
  *              @arg SYM_VC2
  * @retval None
  */
void HAL_VC_Enable(VC_TypeDef *VCx)
{
    REGBITS_SET(VCx->CR0, VCx_CR0_EN_Msk);
    FirmwareDelay(SystemCoreClock / 1000000 * 3);                     // 等待VC模块稳定
    HAL_VC_CLR_FLAG(VCx, VC_FALG_INTF);                               // 清除VC模块稳定前可能出现的中断标志
}


/*******************************************************************************
  * @brief  禁止 VCx
  * @param  VCx: VC名称
  *              @arg SYM_VC1
  *              @arg SYM_VC2
  * @retval None
  */
void HAL_VC_Disable(VC_TypeDef *VCx)
{
    REGBITS_CLR(VCx->CR0, VCx_CR0_EN_Msk);
}


/*******************************************************************************
  * @brief  获取VC输出的电平
  * @param  VCx  : VC名称
  *                @arg SYM_VC1
  *                @arg SYM_VC2
  * @retval 0    : 滤波后为低电平
  *         非0  : 滤波后为高电平
  */
uint8_t HAL_VC_GetOutputValue(VC_TypeDef *VCx)
{
    return (VCx->SR & VCx_SR_FLTV_Msk);
}


/*******************************************************************************
  * @brief  Blank窗口参数配置
  * @param  VCx          : VC名称
  *                        @arg SYM_VC1
  *                        @arg SYM_VC2
  * @param  TriggerSource: Blank窗口触发源
  *                        @arg VC_BLANKSRC_ATIM_OC1REFC
  *                        @arg VC_BLANKSRC_ATIM_OC2REFC
  *                        @arg VC_BLANKSRC_ATIM_OC3REFC
  *                        @arg VC_BLANKSRC_ATIM_OC4REFC
  *                        @arg VC_BLANKSRC_ATIM_OC5REFC
  *                        @arg VC_BLANKSRC_ATIM_OC6REFC的组合
  * @param  BlankTime    : BLANK窗口持续时间
  *                        持续2^(BLANKTIME+2)个PCLK周期
  *         Blanklevel   : BLANK窗口持续期间的输出电平
                           VC_BLANKLEVEL_LOW / VC_BLANKLEVEL_HIGH
  * @retval None
  */
void HAL_VC_Blank_Config(VC_TypeDef *VCx,
                         uint32_t TriggerSource,
                         uint16_t BlankTime,
                         VC_BlankLevelTypeDef BlankLevel)
{
    REGBITS_MODIFY(VCx->CR1, 0x3FF00, (BlankTime << VCx_CR1_BLKTIME_Pos) | TriggerSource | BlankLevel);
}


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
